<?php
class Round_dao extends Base_dao
{	
	function __construct()
    {
		parent::__construct();
		
		$this->nombreTabla = 'round';
		$this->nombreColumnaID = 'id';
		$this->nombreModelo = 'Round_dto';
		
		$this->load->model("$this->nombreModelo");
	}
	
	private function _loadModels()
	{
		$this->load->model('Business_line_dao', 'B_line_dao');
		$this->load->model('Business_line_dto', 'B_line_dto');

		$this->load->model('Outcome_dao', 'Outcome_dao');
		$this->load->model('Outcome_dto', 'Outcome_dto');

		$this->load->model('Output_dao', 'Output_dao');
		$this->load->model('Output_dto', 'Output_dto');

		$this->load->model('Indicator_dao', 'Indicator_dao');
		$this->load->model('Indicator_dto', 'Indicator_dto');
	}

	public function guardar($objRoundDTO, $blines_from_idRound = 0)
	{		
		// Controlar si guarda bien, ya que se está llamando al método padre
		$result = parent::guardar($this->nombreTabla, $this->nombreColumnaID, $objRoundDTO, $objRoundDTO->id);
		
		if($result['exito'])
		{
			if ($objRoundDTO->id == 0) { 
				$objRoundDTO->id = $result['idGenerado']; 

				// Sólo cuando se crea una nueva ronda, se permite importar las BL de otra
				if($blines_from_idRound != 0) {
					// Si se envió un idRound desde el cual copiar las BL asociadas, realizo esta operación
					$this->_loadModels();

					// Tengo que asociar a la ronda todo el árbol de BL, OC, OP e Indicators
					$b_lines_round = $this->B_line_dao->obtenerObjetos(array('idRound' => $blines_from_idRound));
					$error_copy_blines = '';
					foreach ($b_lines_round as $bline) {
						$idBline_original = $bline->id;
						$bline->id = 0; // Defino el id en 0 para que guarde uno nuevo
						$bline->idRound = $objRoundDTO->id; // Lo asocio a la ronda actual

						$result_copy = $this->B_line_dao->guardar($bline);
						if($result_copy['error_msg'] != '') $error_copy_blines .= ' Error whit BL: ' . $result_copy['error_msg'];
						else {
							// Por cada BL busco sus outcomes y guardo
							$outcomes = $this->Outcome_dao->obtenerObjetos(array('idBusinessLine' => $idBline_original));
							$error_copy_outcomes = '';
							foreach ($outcomes as $otc) {
								$idOutcome_original = $otc->id;
								$otc->id = 0; // Defino el id en 0 para que guarde uno nuevo
								$otc->idBusinessLine = $bline->id; // Lo asocio a la nueva BL

								$result_copy = $this->Outcome_dao->guardar($otc);
								if($result_copy['error_msg'] != '') $error_copy_outcomes .= ' Error whit OC: ' . $result_copy['error_msg'];
								else {
									// Por cada outcome busco sus outputs y guardo
									$outputs = $this->Output_dao->obtenerObjetos(array('idOutcome' => $idOutcome_original));
									$error_copy_outputs = '';
									foreach ($outputs as $otp) {
										$idOutput_original = $otp->id;
										$otp->id = 0; // Defino el id en 0 para que guarde uno nuevo
										$otp->idOutcome = $otc->id; // Lo asocio a la nueva outcome

										$result_copy = $this->Output_dao->guardar($otp);
										if($result_copy['error_msg'] != '') $error_copy_outputs .= ' Error whit OP: ' . $result_copy['error_msg'];
										else {
											// Tengo que asociar también los indicadores
											$indicators = $this->Indicator_dao->obtenerObjetos(array('idOutput' => $idOutput_original));
											$error_copy_indicators = '';
											foreach ($indicators as $ind) {
												$ind->id = 0; // Defino el id en 0 para que guarde uno nuevo
												$ind->idOutput = $otp->id; // Lo asocio a la nueva output

												$result_copy = $this->Indicator_dao->guardar($ind);
												if($result_copy['error_msg'] != '') $error_copy_indicators .= ' Error whit Indicator: ' . $result_copy['error_msg'];
											}
											if($error_copy_indicators != '') $result['error_msg'] .= ' ' . $error_copy_indicators;

										}
									}
									if($error_copy_outputs != '') $result['error_msg'] .= ' ' . $error_copy_outputs;
								}
							}
							if($error_copy_outcomes != '') $result['error_msg'] .= ' ' . $error_copy_outcomes;
						}
					}
					if($error_copy_blines != '') $result['error_msg'] .= ' ' . $error_copy_blines;
				}
			}
		}
		
		return $result;
	}

	
	public function borrar($idRound)
	{
		$result = parent::borrar($this->nombreTabla, $this->nombreColumnaID, $idRound);	
		return $result;
	}
	
	public function obtenerDatos($condiciones = array(), $crearObjetos = false, $limite = 0)
	{	
		return parent::obtenerDatos($this->nombreTabla, $this->nombreModelo, $condiciones, $crearObjetos, $limite);
	}
	
	public function obtenerObjetos($condiciones = array(), $limite = 0)
	{
		return $this->obtenerDatos($condiciones, true, $limite);
	}
	
	public function obtenerObjetoPorID($idBuscado)
	{
		$obj = parent::obtenerObjetoPorID($this->nombreTabla, $this->nombreColumnaID, $this->nombreModelo, $idBuscado);
		if($obj == NULL) $obj = new Round_dto();
		
		return $obj;
	}
	
	public function getRoundInputs($idRound) {
		$this->_loadRoundInputModels();
		$condiciones['idRound'] = $idRound;
		
		return $this->obtenerObjetos($condiciones);
	}

	public function getInfoRoundInputs($idRound)
	{
		$sentenciaSQL = "SELECT  rin.idIndicator AS idIndicator,
								 rin.detail AS detail,
								 rin.idUser AS idUser,
								 rin.date AS date_insert,
								 usr.firstName AS firstname,
								 usr.lastName AS lastname,
								 ind.id AS indicator_id,
								 ind.name AS indicator_name,
								 ind.idOwner AS idOwner,
								 otp.name AS output_name,
								 otc.name AS outcome_name,
								 bsl.name AS bline_name
						 FROM roundinput AS rin, 
						 		user AS usr, 
						 		indicator AS ind, 
						 		output AS otp, 
						 		outcome AS otc, 
						 		businessline AS bsl
				 		WHERE rin.idUser = usr.id
				 		AND rin.idIndicator = ind.id
				 		AND ind.idOutput = otp.id
				 		AND otp.idOutcome = otc.id
				 		AND otc.idBusinessLine = bsl.id
				 		AND rin.idRound = $idRound	
							
						ORDER BY bsl.name, otc.name, otp.name, ind.id,  rin.date"; 
		return $this->db->query($sentenciaSQL);
	}
	

	function roundOpen($startDate, $endDate)
	{
		$dateActual = date("Y-m-d");
		//strtotime('now');
 
		$startDate = str_replace('/', '-', $startDate);
		//$startDate = strtotime($startDate);

		$endDate = str_replace('/', '-', $endDate);
		//$endDate = strtotime($endDate);

		if($dateActual >= $startDate &&  $dateActual < $endDate) return true;
		else return false;
	}
}